package com.easyfile.easyfilemaster.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.easyfile.easyfilemaster.entity.FileDetail;
import com.easyfile.easyfilemaster.entity.FileFolder;
import com.easyfile.easyfilemaster.entity.FileInfo;
import com.easyfile.easyfilemaster.entity.FolderInfo;
import com.easyfile.easyfilemaster.entity.base.Result;
import com.easyfile.easyfilemaster.entity.dto.*;
import com.easyfile.easyfilemaster.entity.vo.MultipartUploadVo;

import java.sql.ResultSet;
import java.util.List;

/**
 * 文件操作
 *
 * @author chenpeman
 * @date 2022年05月06日 15:56
 */
public interface FileService {

    /**
     * 创建用户根目录
     *
     * @param userId 用户id
     * @return the boolean
     */
    boolean createDefaultFolder(Long userId);

    /**
     * 获取用户根目录信息
     *
     * @param getDefaultFolderDto the get default folder dto
     * @return the default folder
     */
    Result<FolderInfo> getDefaultFolder(GetDefaultFolderDto getDefaultFolderDto);

    /**
     * 获取某一目录下的子文件夹
     *
     * @param getChildFoldersDto the get child folders dto
     * @return the child folders
     */
    Result<IPage<FolderInfo>> getChildFolders(GetChildFoldersDto getChildFoldersDto);

    /**
     * 获取某一目录下的文件
     *
     * @param getChildFilesDto the get child files dto
     * @return the child files
     */
    Result<IPage<FileInfo>> getChildFiles(GetChildFilesDto getChildFilesDto);

    /**
     * 获取某一类型的文件
     * 1:图片 2：音频 3：视频 4：文档 5：压缩文件 6：其他
     *
     * @param dto the dto
     * @return the files by type id
     */
    Result<IPage<FileInfo>> getFilesByTypeId(GetTypeFilesDto dto);
    /**
     * 按关键字搜索文件
     *
     * @param dto the dto
     * @return the result
     */
    Result<IPage<FileInfo>> searchFiles(SearchFilesDto dto);

    /**
     * 按关键字搜索某一类型的文件
     *
     * @param dto the dto
     * @return the result
     */
    Result<IPage<FileInfo>> searchTypeFiles(SearchTypeFilesDto dto);
    /**
     * 按关键字搜索文件夹
     *
     * @param dto the dto
     * @return the result
     */
    Result<IPage<FolderInfo>> searchFolders(SearchFoldersDto dto);
    /**
     * 下载多个文件
     *
     * @param downloadFilesDto the download files dto
     * @return 文件下载连接集合
     */
    Result<List<String>> downloadFiles(DownloadFilesDto downloadFilesDto);

    /**
     * 在某一目录下插入文件夹
     *
     * @param insertFolderDto the insert folder dto
     * @return the result
     */
    Result<Void> insertFolder(InsertFolderDto insertFolderDto);


    /**
     * 重命名文件夹
     *
     * @param renameFolderDto the rename folder dto
     * @return the result
     */
    Result<Void> renameFolder(RenameFolderDto renameFolderDto);

    /**
     * 重命名文件映射
     *
     * @param renameFileDto the rename file dto
     * @return the result
     */
    Result<Void> renameFile(RenameFileDto renameFileDto);

    /**
     * 批量删除文件
     *
     * @param dto the dto
     * @return the result
     */
    Result<Void> deleteFiles(DeleteFilesDto dto);

    /**
     * 将文件加入到文件夹中
     *
     * @return the result
     */
    Result<Void> insertFileFolder(FileFolder fileFolder);


    /**
     * 批量删除文件夹
     *
     * @param dto the dto
     * @return the result
     */
    Result<Void> deleteFolders(DeleteFoldersDto dto);

    /**
     * 获取分片文件的临时签名上传url
     *
     * @return the presigned chunk urls
     */
    Result<MultipartUploadVo> getPresignedChunkUrls(GetPresignedChunkUrlsDto getGresignedChunkUrlsDto);

    /**
     * 完成上传，合并分片
     *
     * @param dto the dto
     * @return the result
     */
    Result<Void> completeMultipartUpload(CompleteMultipartUploadDto dto);

    /**
     * 批量移动文件
     *
     * @return the result
     */
    Result<Void> moveFiles(MoveFilesDto dto);

    /**
     * 批量复制文件
     *
     * @param dto the dto
     * @return the result
     */
    Result<Void> copyFiles(CopyFilesDto dto);

    /**
     * 批量分享文件
     *
     * @param dto the dto
     * @return the result
     */
    Result<String> shareFiles(ShareFilesDto dto);

    /**
     * 通过密匙保存分享文件
     *
     * @param dto the dto
     * @return the result
     */
    Result<Void> saveShareFiles(SaveShareFilesDto dto);
}
